package cn.itcast.usermanager.service.impl;

import cn.itcast.usermanager.mapper.NewUserMapper;
import cn.itcast.usermanager.mapper.UserMapper;
import cn.itcast.usermanager.pojo.JsonData;
import cn.itcast.usermanager.pojo.User;
import cn.itcast.usermanager.service.UserService;
import com.github.abel533.entity.Example;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;

/**
 *
 * @author zy
 * @date 2018/1/12
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public JsonData selectUser(Integer page, Integer rows) {
        // 由当前页获取起始索引并通过方法传递
//        Integer startIndex = (page - 1) * rows;

        // 获取JsonData中的属性并封装进去
//        List<User> list = this.userMapper.findUsers(startIndex, rows);
        // 总条数 写死不合适,应从数据库查询出总条数并封装到对象中
//        int size = 20;

        // 使用分页插件进行查询
        PageHelper.startPage(page, rows);
        // 查询所有即可,由于分页插件的存在会自动进行分页查询,但此处应该注意分页插件方法与查询方法的顺序
        List<User> userList = this.userMapper.findUsersAll();
        // 将查询出的结果封装到PageInfo里,它里面含有所有分页相关的参数
        PageInfo<User> pageInfo = new PageInfo<>(userList);

//        Integer total = this.userMapper.getTotalCount();
        JsonData jsonData = new JsonData();
        // 直接从pageInfo对象获取需要的参数即可
        jsonData.setTotal((int) pageInfo.getTotal());
        jsonData.setRows(pageInfo.getList());

        return jsonData;
    }

    @Override
    public void insertUsers(User user1, User user2) {
        this.userMapper.insertUser(user1);
        // 为了测试事务,手动制造异常
//        int i = 1 / 0;
        this.userMapper.insertUser(user2);
    }

    @Override
    public Boolean save(User user) {
        // mybatis对数据库进行增删改操作会返回一个int类型的返回值, 值为受影响的条数,可以用来判断操作是否成功
        int rows = this.userMapper.insert(user);
        // 若受影响的行数刚好为1表示操作成功
        if (rows == 1) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Boolean updateUser(User user) {
        // mybatis对数据库进行增删改操作会返回一个int类型的返回值, 值为受影响的条数,可以用来判断操作是否成功
        Integer rows = this.userMapper.updateByPrimaryKeySelective(user);
        // 若受影响的行数刚好为1表示操作成功
        if (rows == 1) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public Boolean deleteUser(List<Object> ids) {
        // 创建Example对象
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id", ids);
        // 分割字符串并遍历(由前端页面可知是以","分割的)
//        String[] userIds = ids.split(",");
        // 调用接口方法
        int rows = this.userMapper.deleteByExample(example);
        if (rows > 0) {
            return true;
        } else {
            return false;
        }
    }

}
